●zmc3独自の拡張について

  zmc3で扱うzmsファイルは基本的に従来のZMSと上位互換性がありますが、
 独自のMML拡張を行った部分については互換性がありません。Z-MUSICの
 ポリシーは「ZMS完全互換」であるため、拡張部分は「ひっそりと」
 使って頂ければ幸いです。他所にzmsを公開される時にも、zmc3独自の
 拡張を用いた場合には元のZ-MUSICでは扱えないことを明記願います。

  ちなみに、以下の拡張を用いた場合でも、出力するZMDファイルに
 ついては、一部を除き従来のV3なZMDの仕様にほぼ準拠しています。

  以下に拡張部分を列挙します。| の引用部分は「やりたいと考えて
 いるが、まだ実装してない」ものです。
 以下オリジナルのZ-MUSIC V3を「従来」と表記します。


 ・@v±
   従来の‾_による相対指定を@vでも用いることができます。

 ・qコマンドによるゲートタイム(クオンタイズレイト?)の先行指定
   ベロシティシーケンスのクオンタイズ版。q8,7,5,8,-10,*2 なんて
  出来ます。(q-10 はV3と同じ。Q*2は@q2と同じとみなす)

 ・和音のベロシティ指定の拡張
   z100,+10,+10 "ceg" などとすればc,e,gそれぞれに別々のベロシティが
  割り当てられるようにしました。なお、↓な指定法も同様に有効です。

 ・ディレイ付き和音の鳴らし方の拡張。
   'c4eg',-3 という指定法を追加しました。この場合、'g4ec',3
  と同じ鳴り方となります。ギターのストロークプレイなんかにどうぞ。


| ・@g12以外の環境でのポルタメントやオートベンドの辻褄合わせ
|   ・・どうやって実装しよう?(ZMD変更必須)
|  .octave_bend_range 12

 ・|: 〜 :|のネストの制限解除
   従来、ネストは8段までと言う制限がありましたが、zmc3では
  メモリの許す限り何重にでもネスト可能です。
   ついでに、従来 |: c | :| とすると、|: c |: | と解釈されて
  おりましたが、これを修正してあります。
  # 逆に、この部分が従来と非互換と言う事でもあります。

 ・{}(連符)で使用できる音符の数の制限解除
   従来は一つの連符内に48個迄しか音符を置くことは出来ませんでした。
  まあ無制限にして意味があるのかと言う話はありますが・・・制限は
  少ないにこしたことはないですよね。

 ・総利用音長の予約
   これではよく分からないかと思いますが、例えば
  {{ c4e4g4<c4 }}*192 などとすると、{{ .. }} の中にある音符が全部
  あわせて全音符分になるかをチェックしてくれるという機能です。
  {{..}}内の総音長(c4e4g4<c4)と予約音長(*192)が一致しない場合は
  Warningを出力します。
   {{c4e4g4<c4}}1 という表記や、{{c4e4g4<c4e4}}1^4 と言う表記も
  可能です。ネストも出来ます。和音や連符、ポルタメントなどを中に
  入れても構いません。

   ギターソロ等を入力していると途中で何tick分入力したか分からなく
  なってしまうといったことが多いかと思いますが、この機能を使う
  ことにより、他のトラックとずれが生じるのを簡単に、未然に防ぐ
  ことが出来ます。
   この拡張は我孫子さんの非常に有用な提案により実装されました。

 ・乱数の種
   下記に示した各種ランダム要素について、「ある決まった乱数」が
  欲しい場合に乱数の種を指定することが出来ます。
  共通コマンド部で .randomize_seed seed値 として下さい。seed値には
  任意のdouble word値(4バイト正数)が指定出来ます。
   seed値を指定しない場合、または.random_seedそのものを指定しない
  場合は、起動時刻を種にしますので文字通りの乱数となります。


| ・演奏素片のランダム選択
|  [%
|   |%20 ccc
|   |%30 ddd
|   |%   eee
|  %]
|  とすると、[%〜%]の中から、20%の確率でcccが、30%の確率で
|  dddが、50%(=100-20-30)の確率でeeeが選ばれ、演奏される。
|  どの素片が演奏されるかはコンパイル時に決定される。

 ・ベロシティの揺らぎ定義
   ベロシティ指定を拡張して、u100:20 とすると、100±20の
  ベロシティがその時々でランダムにアサインされるようにしました。
  揺らぎをオフにする場合には例えば u100:0 と指定して下さい。
   勿論ベロシティシーケンスや臨時ベロシティでも同様の方法で
  利用可能です。
   デフォルトでは揺らぎオフです。

 ・ベロシティの補正
   [VELOCITY.REVISE type,power] とすると、「音長が短くなれば
  なるほどマイナス方向にベロシティを補正する」ようになります。
  typeが補正曲線指定(0=log曲線補正 1=線形補正1 2=線形補正2)で、
  powerが補正の強さ(0で補正オフ)です。
   デフォルトでは補正オフ。ベロシティの揺らぎと併用すると
  効果的です。

   具体的な補正式は下記の通りです。(pがpower,Zが全音符の分解能)
   type=0  補正値= -p * log_2(Z / step)
   type=1  補正値= -p * Z / step
   type=2  補正値= -(Z / step / p)
   type=8  補正値= -p * log_2(Z / step / 4)
   type=16 補正値= 直前のstepが今のstepの半分より大きい時のみ
                type0の補正
   type=24 補正値= 直前のstepが今のstepの半分より大きい時のみ
                type8の補正


   例えばZ=192,power=7の場合、以下の補正がかかります:
          step  192   96   48   24   12    6 ...
          ----------------------------------------
     補正type0    0   -7  -14  -21  -28  -35 ...
     補正type1    0   -7  -28  -56 -112 -127 ...
     補正type2    0   -7  -14  -21  -28  -35 ...
     補正type8  +14   -7    0   -7  -14  -21 ...
     
   その他のtypeについては、思い付き次第おいおい実装していきます(^^;


| ・発音タイミングの揺らぎ定義
|   MML思案中。ただ全音符=192tickでは埒があかないので、
|  内部で全音符=960tickに拡張して揺らぎを扱う。
|  指定はベロシティシーケンスライクに行う。
|   案1: [timing] 80:20, 0:0, 70:20
|      80%の確率で前に(全音符=960tick相当で)1tickずらし、
|     20%の確率で後に1tickずらす。
|      次の音は揺らぎなし。
|      3つ目の音は70%の確率で前に1tickずらし、20%の
|     確率で後に1tickずらす。残り10%は揺らぎ0の確率。
|   案2: [timing] +1@80:-2@20, 0:0, +2@60:+1@10:-1@30
|      80%の確率で前に(全音符=960tick相当で)1tickずらし、
|     20%の確率で後に2tickずらす。
|      次の音は揺らぎなし。
|      3つ目の音は60%の確率で前に2tick,10%の確率で前に
|     1tick,30%の確率で後に1tickずらす。
|  なお、この機能を使う場合、内部的に全音符=960tickになり、
|  それゆえ従来のzmdとは互換性がなくなります。

 ・裏パート演奏処理
   任意のmml演奏を裏に回すことができます。これにより、「裏で
  この音を鳴らしつつ・・・」といった記述を(見かけ上)1トラックで
  行えます。具体的には、例えば
  [back 'c1eg'] gag<c
  とすると、
  (t1) w2 gag<c
  (t2) w 'c1eg'
  相当の出力が得られます。ギター演奏や、キーボードの右手左手の
  mml記述などに便利です。

   ただし現在の版では下記のような制限があります。
   ・[back 'c1eg'] ga [back 'c1ef]
    のように、裏で鳴らす音が重なる場合、Warningを出力します。
    実際にも期待される動作(さらに重ねて発音)をしません。
   ・ダミートラック+同期送信という形で実装しているため、ユーザが
    使用する以上にトラックを消費します(=ユーザ使用trk数+
    [back]使用trk数)。


 ・[back.repeat ...]コマンドの追加
   [back...]に関連して、繰り返し等の演奏制御系コマンドを裏トラックにも
  出力します。
   パラメーターには1,0,ON,OFFを指定できますパラメーター省略時
  ([back.repeat])は1(on)とします。初期値は0(off)です。

  以下のコマンドが影響を受けます。
   |: |n | :|
   [d.c.][segno][$][d.s.][coda][tocoda][*][fine][^][do][loop]
   [end][!][@]

   例: [back.repeat on] |: [back eg] ce :|
   (t1) |: w2 ce :|
   (t2) |: w  eg :|
   相当の出力が得られます。        (Mamiyaさんthanks!)

 ・[gatetime_resolution n]の追加
  トラック内の任意の箇所でゲートタイムレート?(MML Qの分解能)を
  変更できます。
  # となると当然次は全音符の分解能を動的に変更したくなりますが、
  # そこまではまだやってません。

 ・[ARCCn.offset] [velocity.offset]の追加
  ARCCの1/8モード時などで、一旦@a100,90,80,70 などとやってから
  後で全体を10下げたいなどと言う場合、従来では全パラメータを
  書き直す(もしくは2つ目の引数以降を相対指定し、最初のパラメータ
  のみ書き直す)必要がありましたが、そんなときに[ARCC1.offset -10]
  とすれば、全体の指定値を-10できます。
  [velocity.offset]も同様です。       (我孫子さんthanks!)

 ・[ch_fader]の引数にALLをつけたときの動作
  従来では単にALLとすると内蔵音源を含む全デバイスに対する
  フェーダ操作となりましたが、zmc3/z2m3では単に全MIDI楽器に
  対する操作となります。
  また従来MIDI-ALLという指定はできませんでしたが、zmc3では
  それを可能にしています。       (muteさんthanks!)

 ・XG音源専用命令, MU100専用命令の追加
  v0.71現在、
        .XG_SYSTEM_ON id,if / .XG_INIT id,if
        .XG_EXCLUSIVE dev,if,comment {n1,n2,…,ni}
        .XG_PRINT id,if str
        .XG_DISPLAY id,if  {n1,n2,…,n16}
        .XG_EQUALIZER id,if {n1,n2,n3,n4,n5,n6}
        .MU100_VOICE_MAP map,id,if
  すでに実装されており、今後も随時追加されていく予定です。
  # しかし作者はXG音源を持っていません・・・  (muteさんthanks!)

 ・トラック宣言なしでの演奏トラック記述
  いきなり演奏トラックのmmlを書き始めた場合、
  (AMIDI1,1)(t1) が省略されているものと見なすようにしました。
  つまり、いきなり
  ---ここから---
  cdefg
  ---ここまで---
  と書いてもエラーとならず、チャンネル1から音が鳴ると言うことです。

  同様に、(AMIDIn,n) (トラック番号とチャンネル番号が等しい)を
  省略できるようにもなっています。つまり、いきなり
  (t1)cdefg
  (t2)ab<c
  なんて書いても問題ないと言うことです。

  ただしちょっと制限があって、このように(AMIDI..)が省略された
  場合は、[back..]がうまく機能しません。とほほ。